home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 176-200 / 189 / nethack / eenamiga.zoo / Amiga / amigaTTY.c < prev    next >
C/C++ Source or Header  |  1988-07-25  |  6KB  |  299 lines

  1. /*    SCCS Id: @(#)amigaTTY.c    2.3    88/07/25
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* tty.c - (Amiga) version */
  4.  
  5.  
  6. #include <stdio.h>
  7. #include "hack.h"
  8. #include "func_tab.h"
  9.  
  10. extern int Enable_Abort;
  11.  
  12. static char erase_char, kill_char;
  13.  
  14. /*
  15.  * Get initial state of terminal, set ospeed (for termcap routines)
  16.  * and switch off tab expansion if necessary.
  17.  * Called by startup() in termcap.c and after returning from ! or ^Z
  18.  */
  19. gettty()
  20. {
  21.     erase_char = 127;        /* DEL */
  22.     kill_char = 21;        /* cntl-U */
  23.     flags.cbreak = TRUE;
  24.     Enable_Abort = 0;
  25.     curx = 1;
  26.     cury = 1;
  27. }
  28.  
  29. /* reset terminal to original state */
  30. settty(s)
  31. char *s;
  32. {
  33.     end_screen();
  34.     if (s) {
  35.     printf(s);
  36.     curx = FAR;    /* For msexit(): don't exit immediately */
  37.     }
  38.     (void) fflush(stdout);
  39.     /* Do not close the screen, that is done in msexit() */
  40. }
  41.  
  42.  
  43. /* fatal error */
  44. /*VARARGS1*/
  45. error(s,x,y)
  46. char *s;
  47. {
  48.     end_screen();
  49.     putchar('\n');
  50.     printf(s,x,y);
  51.     putchar('\n');
  52.     abort(1);
  53. }
  54.  
  55. /*
  56.  * Read a line closed with '\n' into the array char bufp[BUFSZ].
  57.  * (The '\n' is not stored. The string is closed with a '\0'.)
  58.  * Reading can be interrupted by an escape ('\033') - now the
  59.  * resulting string is "\033".
  60.  */
  61. getlin(bufp)
  62. register char *bufp;
  63. {
  64.     register char *obufp = bufp;
  65.     register int c;
  66.  
  67.     flags.toplin = 2;         /* nonempty, no --More-- required */
  68.     for(;;) {
  69.     (void) fflush(stdout);
  70.     if((c = getchar()) == EOF) {
  71.         *bufp = 0;
  72.         return;
  73.     }
  74.     if(c == '\033') {
  75.         *obufp = c;
  76.         obufp[1] = 0;
  77.         return;
  78.     }
  79.     if(c == erase_char || c == '\b') {
  80.         if(bufp != obufp) {
  81.         bufp--;
  82.         putstr("\b \b"); /* putsym converts \b */
  83.         } else    bell();
  84.     } else if(c == '\n') {
  85.         *bufp = 0;
  86.         return;
  87.     } else if(' ' <= c && c < '\177') {
  88.         /* avoid isprint() - some people don't have it
  89.            ' ' is not always a printing char */
  90.         *bufp = c;
  91.         bufp[1] = 0;
  92.         putstr(bufp);
  93.         if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
  94.         bufp++;
  95.     } else if(c == kill_char || c == '\177') { /* Robert Viduya */
  96.         /* this test last - @ might be the kill_char */
  97.         while(bufp != obufp) {
  98.         bufp--;
  99.         putstr("\b \b");
  100.         }
  101.     } else
  102.         bell();
  103.     }
  104. }
  105.  
  106. getret()
  107. {
  108.     cgetret("");
  109. }
  110.  
  111. cgetret(s)
  112. register char *s;
  113. {
  114.     putsym('\n');
  115.     if(flags.standout)
  116.     standoutbeg();
  117.     putstr("Hit ");
  118.     putstr(flags.cbreak ? "space" : "return");
  119.     putstr(" to continue: ");
  120.     if(flags.standout)
  121.     standoutend();
  122.     xwaitforspace(s);
  123. }
  124.  
  125. char morc;    /* tell the outside world what char he used */
  126.  
  127. xwaitforspace(s)
  128. register char *s;    /* chars allowed besides space or return */
  129. {
  130. register int c;
  131.  
  132.     morc = 0;
  133.     while((c = readchar()) != '\n') {
  134.     if(flags.cbreak) {
  135.         if(c == ' ') break;
  136.         if(s && index(s,c)) {
  137.         morc = c;
  138.         break;
  139.         }
  140.         bell();
  141.     }
  142.     }
  143. }
  144.  
  145. static int last_multi;
  146.  
  147. char *
  148. parse()
  149. {
  150.     static char inline[COLNO];
  151.     register foo;
  152.  
  153.     flags.move = 1;
  154.     if(!Invisible) curs_on_u(); else home();
  155.     multi = 0;
  156. #ifdef DGK
  157.     while((foo = readchar()) >= '0' && foo <= '9') {
  158.     multi = 10*multi+foo-'0';
  159.     if (multi < 0 || multi > LARGEST_INT)
  160.         multi = LARGEST_INT;
  161.     if (multi > 9) {
  162.         remember_topl();
  163.         home();
  164.         cl_end();
  165.         printf("Count: %d", multi);
  166.     }
  167.     last_multi = multi;
  168.     }
  169. # ifdef REDO
  170.     if (foo == DOAGAIN || in_doagain)
  171.     multi = last_multi;
  172.     else {
  173.     savech(0);    /* reset input queue */
  174.     savech(foo);
  175.     }
  176. # endif
  177.  
  178. #else /* DGK */
  179.  
  180.     while((foo = readchar()) >= '0' && foo <= '9')
  181.     multi = 10*multi+foo-'0';
  182.  
  183. #endif /* DGK */
  184.  
  185.     if(multi) {
  186.     multi--;
  187.     save_cm = inline;
  188.     }
  189.     inline[0] = foo;
  190.     inline[1] = 0;
  191.     if(foo == 'g' || foo == 'G'){
  192.     inline[1] = getchar();
  193. #ifdef REDO
  194.     savech(inline[1]);
  195. #endif
  196.     inline[2] = 0;
  197.     }
  198.     if(foo == 'm' || foo == 'M'){
  199.     inline[1] = getchar();
  200. #ifdef REDO
  201.     savech(inline[1]);
  202. #endif
  203.     inline[2] = 0;
  204.     }
  205.     clrlin();
  206.     return(inline);
  207. }
  208.  
  209. char
  210. readchar() {
  211.     register int sym;
  212.  
  213.     (void) fflush(stdout);
  214.     sym = getchar();
  215.     if(flags.toplin == 1)
  216.     flags.toplin = 2;
  217.     return((char) sym);
  218. }
  219. #ifdef COM_COMPL
  220. /* Read in an extended command - doing command line completion for
  221.  * when enough character have been entered to make a unique command.
  222.  * This is just a modified getlin().   -jsb
  223.  */
  224. get_ext_cmd(bufp)
  225. register char *bufp;
  226. {
  227.     register char *obufp = bufp;
  228.     register int c;
  229.     int com_index, index;
  230.  
  231.     flags.toplin = 2;         /* nonempty, no --More-- required */
  232.  
  233.     for(;;) {
  234.     (void) fflush(stdout);
  235.     if((c = readchar()) == EOF) {
  236.         *bufp = 0;
  237.         return;
  238.     }
  239.     if(c == '\033') {
  240.         *obufp = c;
  241.         obufp[1] = 0;
  242.         return;
  243.     }
  244.     if(c == erase_char || c == '\b') {
  245.         if(bufp != obufp) {
  246.         bufp--;
  247.         putstr("\b \b"); /* putsym converts \b */
  248.         } else    bell();
  249.     } else if(c == '\n') {
  250.         *bufp = 0;
  251.         return;
  252.     } else if(' ' <= c && c < '\177') {
  253.         /* avoid isprint() - some people don't have it
  254.            ' ' is not always a printing char */
  255.         *bufp = c;
  256.         bufp[1] = 0;
  257.         index = 0;
  258.         com_index = -1;
  259.  
  260.         while(extcmdlist[index].ef_txt != (char *) 0){
  261.         if(!strncmp(obufp, extcmdlist[index].ef_txt,
  262.         strlen(obufp)))
  263.             if(com_index == -1) /* No matches yet*/
  264.             com_index = index;
  265.             else /* More than 1 match */
  266.             com_index = -2;
  267.         index++;
  268.         }
  269.         if(com_index >= 0){
  270.         strcpy(obufp,
  271.         extcmdlist[com_index].ef_txt);
  272.         /* finish print our string */
  273.         putstr(bufp);
  274.         bufp = obufp; /* reset it */
  275.         if(strlen(obufp) < BUFSIZ-1 &&
  276.          strlen(obufp) < COLNO)
  277.             /* set bufp at the end of our
  278.              * string
  279.              */
  280.             bufp += strlen(obufp);
  281.         } else {
  282.         putstr(bufp);
  283.         if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
  284.             bufp++;
  285.         }
  286.     } else if(c == kill_char || c == '\177') { /* Robert Viduya */
  287.         /* this test last - @ might be the kill_char */
  288.         while(bufp != obufp) {
  289.         bufp--;
  290.         putstr("\b \b");
  291.         }
  292.     } else
  293.         bell();
  294.     }
  295.  
  296. }
  297. #endif COM_COMPL
  298.  
  299.